[c++]类的转换问题

来源:百度知道 编辑:UC知道 时间:2024/05/25 06:42:51
比如有以下两个类
class A
{
friend class B;
private:int a,b;
public:
A():a(0),b(0){}
A(A& rv):a(rv.a),b(rv.b){}
A(const B rv):a((int)rv.x),b((int)rv.y){}
operator B(){B ret(a,b);return ret;}
};
class B
{
friend class A;
private:float x,y;
public:
B():x(0),y(0){}
B(B& rv):x(rv.x),y(rv.y){}
B(const A rv):x(rv.a),y(rv.b){}
operator A(){A ret((int)x,(int)y);return ret;}
};
那么如果有以下函数:
void func(A,B);
并且我定义了:
A iA; B iB;

然后:
func(iB,iA);的时候,会使用转换构造函数还是转换运算符?
iA=iB;的时候,会使用转换构造函数还是转换运算符?

(更新过)首先,像这种程序编译不过,因为A提供了A和B之间相互转换的方法,B也提供了A和B之间相互转换的方法,造成了类型转换的二义性。例如A的转换预算符提供了A到B的的转化,B的转换构造函数也提供了A到B的转换,他们的功能是一样的,编译器就不知道该使用哪个,从而造成二义性。实际上只需一个类提供相互转换的方法就行了,或者每一个类提供一种类型的转换。

func(iB,iA);的时候,会调用类型A到B和类型B到A的,换构造函数(转入,转换成当前类型)或者转换运算符(转出,转换成其他类型)。返回值和返回类型也应该是这样。

iA=iB;的时候,会使用是转换运算符,因为iA=iB就应该相当于iA=(A)iB,编译器可能会处理成这种形式,当然调用的也就是转换预算符,因为等号是右结合的。

下面程序测试通过(4中情况):

#include <stdio.h>

class A
{
friend class B;
private:
float a,b;
public:
A():a(0),b(0){}
A(const A& rv):a(rv.a),b(rv.b){printf("a copy\n");}
const A& operator=(const A& b) {printf("a assign\n");return *this;}

A(const B rv);
operator B();

};

class B
{
friend class A;
private:
float x,y;
public:
B():x(0),y(0){}

B(const B& rv):x(rv.x),y(rv.y){printf("b copy\n");}
const B& operator=(const B& b) {printf(